package com.Calculator;

import javax.swing.*;
import java.awt.*;

public class Demo extends JFrame
{
    // 计算器按键名字
    private final String[] KEYS = {"7", "8", "9", "+", "%", "x^2", "4", "5", "6", "-", "^",
            "(x+1)^2", "1", "2", "3", "*", "√￣", "x+x*y", "0", ".", "=", "/", "1/x", "x^2+y^2"};
    // 计算器功能键名字
    private final String[] COMMANDS = {"(●'◡'●)", "Mode", "Clear", "Backspace"};
    // 计算器正余弦函数名字
    private final String[] FUN = {"sin", "cos", "tan", "'◡'"};

    // 计算器按键按钮
    private JButton keys[] = new JButton[KEYS.length];
    // 计算器功能键按钮
    private JButton commands[] = new JButton[COMMANDS.length];
    // 计算器正余弦函数按钮
    private JButton fun[] = new JButton[FUN.length];
    // 计算器结果显示文本框
    private JTextField displayText = new JTextField("");

    /*
     * 构造函数
     */
    public Demo() {
        // 调用父类方法
        super();
        // 初始化计算器
        init();
        // 设置计算器的背景颜色
        this.setBackground(Color.LIGHT_GRAY);
        // 设置标题
        this.setTitle("Calculator");
        // 设置计算器显示坐标(500, 300)
        this.setLocation(500, 300);
        // 禁止修改计算器大小
        this.setResizable(false);
        // 计算器中各组件大小自适应
        this.pack();
    }

    /*
     * 初始化计算器
     */
    private void init() {
        // 按键字体样式
        Font font = new Font(null, Font.BOLD, 14);
        // 文本框内容右对齐
        displayText.setHorizontalAlignment(JTextField.RIGHT);
        // 禁止修改结果文本框
        displayText.setEditable(false);
        // 设置文本框背景颜色
        displayText.setBackground(Color.WHITE);
        // 设置文本框字体
        displayText.setFont(font);

        // 初始化计算器按键按钮，放在一个面板内
        JPanel keysPanel = new JPanel();
        // 使用网格布局器，4行6列，水平与竖直方向均相差3个像素
        keysPanel.setLayout(new GridLayout(4, 6, 3, 3));
        for (int i = 0; i < KEYS.length; ++i)
        {
            keys[i] = new JButton(KEYS[i]);
            keysPanel.add(keys[i]);
            keys[i].setFont(font); // 按键字体加粗，下同
            keys[i].setForeground(Color.BLACK); // 设置按键颜色为黑色
        }
        // 设置基本运算符键为红色
        keys[3].setForeground(Color.RED);
        keys[9].setForeground(Color.RED);
        keys[15].setForeground(Color.RED);
        keys[20].setForeground(Color.RED);
        keys[21].setForeground(Color.RED);
        // 设置右侧函数表达式键为蓝色
        for (int i = 4; i < KEYS.length; i += 6)
        {
            keys[i].setForeground(Color.BLUE);
            keys[i + 1].setForeground(Color.BLUE);
        }

        // 初始化功能键按钮，放在一个面板内
        JPanel commandsPanel = new JPanel();
        // 使用网格布局器，1行4列，水平与竖直方向均相差3个像素
        commandsPanel.setLayout(new GridLayout(1, 4, 3, 3));
        for (int i = 0; i < COMMANDS.length; ++i)
        {
            commands[i] = new JButton(COMMANDS[i]);
            commandsPanel.add(commands[i]);
            commands[i].setFont(font);
            commands[i].setForeground(Color.RED); // 设置按键颜色为红色
        }

        // 初始化正余弦函数键按钮，放在一个面板内
        JPanel funPanel = new JPanel();
        // 使用网格布局器，4行1列，水平与竖直方向均相差3个像素
        funPanel.setLayout(new GridLayout(4, 1, 3, 3));
        for (int i = 0; i < FUN.length; ++i)
        {
            fun[i] = new JButton(FUN[i]);
            funPanel.add(fun[i]);
            fun[i].setFont(font);
            fun[i].setForeground(Color.BLUE);
        }

        // 将正余弦函数与基本按键放在同一个画板
        JPanel panel = new JPanel();
        // 画板采用边界布局管理器，水平与竖直方向均相差3个像素
        panel.setLayout(new BorderLayout(3, 3));
        panel.add("Center", keysPanel);
        panel.add("West", funPanel);

        // 将文本框放在一个画板
        JPanel text = new JPanel();
        text.setLayout(new BorderLayout());
        text.add("Center", displayText);

        // 整体布局
        getContentPane().setLayout(new BorderLayout(3, 3));
        getContentPane().add("North", text);
        getContentPane().add("Center", commandsPanel);
        getContentPane().add("South", panel);

    }

    /**
     * 主函数
     */
    public static void main(String[] args)
    {
        Demo calculator = new Demo();
        calculator.setVisible(true);
        calculator.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}